/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controller;

import Model.HashPaginas;
import Model.Marco;
import Model.MarcoPagina;
import Model.Pagina;
import com.sun.org.apache.xml.internal.serialize.Printer;
import java.io.*;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Diego
 */
public class Controlador {

    private HashPaginas hash;
    private int tamHash;

    public Controlador(int TamHash) {
        this.hash = new HashPaginas(TamHash);
        this.tamHash = TamHash;

    }

    public HashPaginas getHash() {
        return hash;
    }

    public MarcoPagina aleatorio(int tamañoPag, int anchoPag, int marco) {

        int randomVirt = (int) (Math.random() * 1000000) % (tamañoPag * anchoPag);

        //int numMarco = (int)(Math.random()*1000000)%marco;


        String dirVirt = Integer.toString(randomVirt);

        Pagina tempPag = new Pagina();
        tempPag.pagDecimal(anchoPag, dirVirt, tamañoPag);
        int bitV = (int) (Math.random() * 1000000) % 2;
        Marco tempMarco;
        if (bitV == 0) {
            tempMarco = new Marco(54321);
        } else {
            tempMarco = new Marco(marco);
        }
        return new MarcoPagina(tempPag, tempMarco, bitV);
    }

    public void LlenarAleatorio(int tamaño, int anchoPagina) {

        for (int i = 0; i < tamHash; i++) {

            MarcoPagina temp = aleatorio(tamaño, anchoPagina, i);

            hash.add(temp);
            System.out.println("Se crearon aleatorios");

        }
    }

    public Vector getDataforTableTLB() {
        Vector<Vector<String>> data = new Vector<Vector<String>>();
        for (int i = 0; i < tamHash; i++) {
            //MarcoPagina pac = new MarcoPagina();
            Vector<String> row = new Vector<String>();
            //pac = hash.getElemento(i);
            if (hash.getElemento(i) != null) {
                if (hash.getElemento(i).getValido() == 1) {
                    row.add(Integer.toString(hash.getElemento(i).getPagina().getNumPag()));
                    row.add(Integer.toString(hash.getElemento(i).getMarco().getNumeroMarco()));
                    data.add(row);
                }
            }
        }
        return data;
    }

    public Vector getTitlesTLB() {
        Vector<String> titles = new Vector<String>();
        titles.add("Numero de Página");
        titles.add("Marco");
        return titles;
    }

    public Vector getDataforTableTP() {
        Vector<Vector<String>> data = new Vector<Vector<String>>();
        for (int i = 0; i < tamHash; i++) {


            if (hash.getElemento(i) != null) {
                MarcoPagina pac;
                Vector<String> row = new Vector<String>();
                pac = hash.getElemento(i);


                if (pac.getValido() == 1) {
                    row.add(Integer.toString(pac.getPagina().getNumPag()));
                    row.add(Integer.toString(pac.getMarco().getNumeroMarco()));
                    row.add("V");
                    data.add(row);
                } else {
                    row.add(Integer.toString(pac.getPagina().getNumPag()));
                    row.add("X");
                    row.add("I");
                    data.add(row);
                }
            }

        }
        return data;
    }

    public Vector getTitlesTP() {
        Vector<String> titles = new Vector<String>();
        titles.add("Numero de Página");
        titles.add("Marco");
        titles.add("Bit Valido");
        return titles;
    }

    public void imprimirArchivo() {
        File file = new File("Direcciones.txt");
        try {
            FileWriter fileWriter = new FileWriter(file);
            PrintWriter printer = new PrintWriter(fileWriter);

            for (int i = 0; i < tamHash; i++) {
                if (getHash().getElemento(i) != null) {
                    printer.println("----------------------------------------");
                    printer.println("Numero Pag: " + getHash().getElemento(i).getPagina().getNumPag());
                    printer.println("Tamaño: " + getHash().getElemento(i).getPagina().getTamano());
                    printer.println("Bit de Validez: " + getHash().getElemento(i).getValido());
                    printer.println("Posicion Hash: " + i);
                    printer.println("Virtual: " + getHash().getElemento(i).getPagina().getDireccionVirtual().getEntero() + " Fisica: " + getHash().getElemento(i).getPagina().getDireccionFisica().getEntero());
                    if (getHash().getElemento(i).getMarco().getNumeroMarco() != 54321) {
                        printer.println("Marco: " + getHash().getElemento(i).getMarco().getNumeroMarco());
                    } else {
                        printer.println("Marco: No tiene Marco Asociado");
                    }
                }
            }
            printer.close();
            fileWriter.close();
        } catch (IOException ex) {
            Logger.getLogger(Controlador.class.getName()).log(Level.SEVERE, null, ex);
        } 
       


    }
}
/*
 for (int i = 0; i < 16; i++) {
 if(cont.getHash().getElemento(i) !=null){
 System.out.println("----------------------------------------");
 System.out.println("Numero Pag: "+cont.getHash().getElemento(i).getPagina().getNumPag());
 System.out.println("Tamaño: "+cont.getHash().getElemento(i).getPagina().getTamano());
 System.out.println("Bit de Validez: "+cont.getHash().getElemento(i).getValido());
 System.out.println("Posicion Hash: "+ i);
 System.out.println("Virtual: "+cont.getHash().getElemento(i).getPagina().getDireccionVirtual().getEntero()+ " Fisica: "+ cont.getHash().getElemento(i).getPagina().getDireccionFisica().getEntero());
 if(cont.getHash().getElemento(i).getMarco().getNumeroMarco()!= 54321){
 System.out.println("Marco: "+cont.getHash().getElemento(i).getMarco().getNumeroMarco());
 }else{
 System.out.println("Marco: No tiene Marco Asociado");
 }
     
 */
